/* * Copyright (C) 2015 Adrien Guille <adrien.guille@univ-lyon2.fr> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package main.java.fr.ericlab.sondy.core.ui; import main.java.fr.ericlab.sondy.core.app.Main; import main.java.fr.ericlab.sondy.core.utils.UIUtils; import java.io.IOException; import java.nio.file.Paths; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; import javafx.application.Platform; import javafx.event.ActionEvent; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.control.TextArea; import javafx.scene.layout.GridPane; import javafx.scene.layout.VBoxBuilder; import javafx.scene.web.WebView; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.StageStyle; import main.java.fr.ericlab.sondy.algo.eventdetection.EventDetectionMethod; import main.java.fr.ericlab.sondy.algo.influenceanalysis.InfluenceAnalysisMethod; import main.java.fr.ericlab.sondy.core.app.Configuration; import org.apache.commons.io.FileUtils; import org.reflections.Reflections; /** * * @author Adrien GUILLE, Laboratoire ERIC, Université Lumière Lyon 2 */ public class GlobalUI { // Global UI component public GridPane globalGridPane; MenuBar globalMenu; public static TabPane tabPane; // UI components DataCollectionUI dataCollectionUI; DataManipulationUI dataManipulationUI; EventDetectionUI eventDetectionUI; InfluenceAnalysisUI influenceAnalysisUI; LogUI logUI; public GlobalUI(){ globalGridPane = new GridPane(); // dataCollectionUI = new DataCollectionUI(); dataManipulationUI = new DataManipulationUI(); eventDetectionUI = new EventDetectionUI(); influenceAnalysisUI = new InfluenceAnalysisUI(); logUI = new LogUI(); menuBar(); tabPane = new TabPane(); tabPane.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); // Tab dataCollectionTab = new Tab("Data Collection"); // dataCollectionTab.setContent(dataCollectionUI.grid); Tab dataManipulationTab = new Tab("Data Manipulation"); dataManipulationTab.setContent(dataManipulationUI.grid); Tab eventTab = new Tab("Event Detection"); eventTab.setContent(eventDetectionUI.grid); Tab influenceTab = new Tab("Influence Analysis"); influenceTab.setContent(influenceAnalysisUI.grid); tabPane.getTabs().addAll(dataManipulationTab,eventTab,influenceTab); tabPane.getSelectionModel().select(0); globalGridPane.add(globalMenu,0,0); globalGridPane.add(tabPane,0,1); globalGridPane.add(logUI.logGrid,0,2); LogUI.addLogEntry("Application started - available cores: "+Configuration.numberOfCores+", workspace: "+Configuration.workspace); } public final void menuBar(){ globalMenu = new MenuBar(); globalMenu.setMinWidth(Main.windowWidth); Menu fileMenu = new Menu("File"); Menu editMenu = new Menu("Edit"); Menu aboutMenu = new Menu("About"); globalMenu.getMenus().addAll(fileMenu,editMenu,aboutMenu); MenuItem exitItem = new MenuItem("Quit SONDY"); fileMenu.getItems().add(exitItem); exitItem.setOnAction((ActionEvent t) -> { Platform.exit(); System.exit(0); }); MenuItem configurationItem = new MenuItem("Edit configuration"); editMenu.getItems().add(configurationItem); configurationItem.setOnAction((ActionEvent t) -> { editConfigurationFile(); }); MenuItem aboutItem = new MenuItem("About SONDY"); aboutMenu.getItems().add(aboutItem); aboutItem.setOnAction((ActionEvent t) -> { about(); }); } public final void editConfigurationFile(){ try { TextArea textArea = new TextArea(); textArea.setText(FileUtils.readFileToString(Paths.get("./configuration.properties").toFile())); UIUtils.setSize(textArea, Main.columnWidthLEFT/2+10, 100); final Stage stage = new Stage(); stage.setResizable(false); stage.initModality(Modality.WINDOW_MODAL); stage.initStyle(StageStyle.UTILITY); stage.setTitle("Edit configuration"); Button saveButton = new Button("Save changes"); UIUtils.setSize(saveButton, Main.columnWidthLEFT/2+10, 24); Button cancelButton = new Button("Cancel changes"); cancelButton.setOnAction((ActionEvent t) -> { stage.close(); }); saveButton.setOnAction((ActionEvent t) -> { try { FileUtils.write(Paths.get("./configuration.properties").toFile(),textArea.getText()); stage.close(); } catch (IOException ex) { Logger.getLogger(GlobalUI.class.getName()).log(Level.SEVERE, null, ex); } }); UIUtils.setSize(cancelButton, Main.columnWidthLEFT/2+10, 24); Label label = new Label(); label.setId("smalltext"); label.setText("SONDY needs to restart for the changes to take effect"); Scene scene = new Scene(VBoxBuilder.create().children(textArea,label,saveButton,cancelButton).alignment(Pos.CENTER).padding(new Insets(10)).spacing(3).build()); scene.getStylesheets().add("resources/fr/ericlab/sondy/css/GlobalStyle.css"); stage.setScene(scene); stage.show(); } catch (IOException ex) { Logger.getLogger(GlobalUI.class.getName()).log(Level.SEVERE, null, ex); } } public void about(){ final Stage stage = new Stage(); stage.setResizable(false); stage.initModality(Modality.WINDOW_MODAL); stage.initStyle(StageStyle.UTILITY); stage.setTitle("About SONDY"); WebView webView = new WebView(); webView.getEngine().loadContent(getReferences()); webView.setMaxWidth(Main.columnWidthLEFT); webView.setMinWidth(Main.columnWidthLEFT); webView.setMaxHeight(Main.columnWidthLEFT); webView.setMinHeight(Main.columnWidthLEFT); Scene scene = new Scene(VBoxBuilder.create().children(new Label("SONDY "+Main.version),new Label("Main developper: Adrien Guille <adrien.guille@univ-lyon2.fr>"),webView).alignment(Pos.CENTER).padding(new Insets(10)).spacing(3).build()); scene.getStylesheets().add("resources/fr/ericlab/sondy/css/GlobalStyle.css"); stage.setScene(scene); stage.show(); } public String getReferences(){ String references = "<html><body><h1>Event detection</h1><ul>"; Reflections reflections = new Reflections("main.java.fr.ericlab.sondy.algo.eventdetection"); Set<Class<? extends EventDetectionMethod>> classes = reflections.getSubTypesOf(EventDetectionMethod.class); for(Class<? extends EventDetectionMethod> aClass : classes){ try { EventDetectionMethod method = (EventDetectionMethod) Class.forName(aClass.getName()).newInstance(); references += method.getCitation(); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) { Logger.getLogger(EventDetectionUI.class.getName()).log(Level.SEVERE, null, ex); } } references += "</ul><h1>Influence analysis</h1><ul>"; reflections = new Reflections("main.java.fr.ericlab.sondy.algo.influenceanalysis"); Set<Class<? extends InfluenceAnalysisMethod>> classes1 = reflections.getSubTypesOf(InfluenceAnalysisMethod.class); for(Class<? extends InfluenceAnalysisMethod> aClass : classes1){ try { InfluenceAnalysisMethod method = (InfluenceAnalysisMethod) Class.forName(aClass.getName()).newInstance(); references += method.getCitation(); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) { Logger.getLogger(EventDetectionUI.class.getName()).log(Level.SEVERE, null, ex); } } return references+"</ul></body></html>"; } }